home *** CD-ROM | disk | FTP | other *** search
/ Belgian Amiga Club - ADF Collection / BS1 part 34.zip / BS1 part 34 / GFA basic training.adf / Sound / RHYTHMUS_MASCH.LST < prev    next >
File List  |  1989-06-01  |  7KB  |  256 lines

  1. ' Rhythmusmaschine
  2. ' Laden, Wiedergabe & Veraenderung von vier Digitalschwingungen
  3. ' interaktiv und synchron
  4. @init
  5. @lesen
  6. @einschalten
  7. @kanalbox
  8. REPEAT
  9.   @mausselect
  10.   @kanalwahl_Ändern
  11. UNTIL MOUSEK=2
  12. ' Alles aus dem Speicher freigeben
  13. @ausschalten
  14. END
  15. '
  16. > PROCEDURE init
  17.   DIM sample$(3)
  18.   DIM lÄnge&(3)
  19.   DIM speicheradr%(3)
  20.   DIM frei%(3)
  21.   DIM wert&(3)
  22. RETURN
  23. '
  24. > PROCEDURE lesen
  25.   FOR i|=0 TO 3
  26.     ' Fileselect mit Pfadvorgabe auf die Sample-Datei:
  27.     FILESELECT "Sample laden","Laden",":Samples/",sample$(i|)
  28.     IF sample$(i|)="" OR RIGHT$(sample$(i|))=":"
  29.       PRINT "Keinen Sample laden ??"
  30.       END
  31.     ENDIF
  32.     OPEN "I",#1,sample$(i|)
  33.     lÄnge&(i|)=LOF(#1)
  34.     CLOSE #1
  35.     IF SHR(lÄnge&(i|),1)>65535
  36.       PRINT "Sampledatei zu lang!!"
  37.       END
  38.     ENDIF
  39.     speicheradr%(i|)=MALLOC(lÄnge&(i|),&H2)
  40.     IF speicheradr%(i|)=0
  41.       PRINT "FATAL - Speicher kann nicht reserviert werden"
  42.       END
  43.     ENDIF
  44.     ' Infos:
  45.     PRINT "Name:   ";sample$(i|)
  46.     PRINT "Größe:  ";lÄnge&(i|)
  47.     PRINT "Adresse:";HEX$(speicheradr%(i|))
  48.     BLOAD sample$(i|),speicheradr%(i|)
  49.   NEXT i|
  50. RETURN
  51. '
  52. > PROCEDURE einschalten
  53.   ' Initialisierung aller Kanäle, ohne einzuschalten
  54.   DPOKE &HDFF096,15
  55.   FOR i|=0 TO 3
  56.     LONG{(&HDFF0A0+&H10*i|)}=speicheradr%(i|)
  57.     DPOKE (&HDFF0A4+&H10*i|),SHR(lÄnge&(i|),1)
  58.     DPOKE (&HDFF0A6+&H10*i|),100
  59.     DPOKE (&HDFF0A8+&H10*i|),64
  60.   NEXT i|
  61. RETURN
  62. > PROCEDURE ausschalten
  63.   ' Wiedergabe aus
  64.   DPOKE &HDFF096,15
  65.   CLS
  66.   FOR i|=0 TO 3
  67.     frei%(i|)=MFREE(speicheradr%(i|),lÄnge&(i|))
  68.     PRINT sample$(i|)
  69.     PRINT "Kanal:        ";i|
  70.     PRINT "Sample-Period:";wert&(i|)
  71.     PRINT "--------------"
  72.   NEXT i|
  73. RETURN
  74. > PROCEDURE schiebe_regler(x%,y|,u$,g_x%,g_y|,min&,max&,VAR wert&)
  75.   '
  76.   u_breite%=LEN(u$)*8
  77.   b_breite%=MAX(u_breite%+10,g_x%+10,268)
  78.   b_hÖhe%=(12+10)+g_y|+(12+10)+10+(12+10)
  79.   mitte&=x%+b_breite%/2
  80.   '
  81.   '                  Hintergrund retten
  82.   COLOR 0
  83.   PBOX x%,y|,x%+b_breite%+6,y|+b_hÖhe%+4
  84.   COLOR 1
  85.   '                  Box zeichnen
  86.   BOX x%,y|,x%+b_breite%+6,y|+b_hÖhe%+4
  87.   BOX x%+3,y|+2,x%+b_breite%+3,y|+b_hÖhe%+2
  88.   ADD x%,3
  89.   ADD y|,2
  90.   '                  Überschrift setzen
  91.   BOX mitte&-(LEN(u$)*8)/2-2,y|+5,mitte&+(LEN(u$)*8)/2+2,y|+17
  92.   TEXT mitte&-(LEN(u$)*8)/2,y|+14,u$
  93.   '                  Box für Wert mit Wert
  94.   BOX mitte&-25,y|+12+10+g_y|+5,mitte&+25,y|+12+10+g_y|+17
  95.   tl|=LEN(STR$(wert&))*8
  96.   ty|=y|+12+10+g_y|+14
  97.   TEXT mitte&-tl|/2,ty|,wert&
  98.   '                  Slider zeichnen
  99.   sxl&=mitte&-109
  100.   sxr&=mitte&+109
  101.   syo&=y|+(12+10)+g_y|+(12+10)
  102.   syu&=syo&+10
  103.   BOX sxl&,syo&,sxr&,syu&
  104.   BOX sxl&-20,syo&,sxr&+20,syu&
  105.   TEXT sxl&-14,syu&-2,"-"
  106.   TEXT sxr&+6,syu&-2,"+"
  107.   '                   Sprite-Daten
  108.   sprite$=""
  109.   FOR i|=1 TO 18
  110.     sprite$=sprite$+CHR$(0)+CHR$(255)
  111.   NEXT i|
  112.   SPRITE #2,sprite$
  113.   '                   Ende Button
  114.   '
  115.   text$="Kanal Wechsel"
  116.   x1%=mitte&-(LEN(text$)*8+10)/2
  117.   x2%=mitte&+(LEN(text$)*8+10)/2
  118.   y1|=y|+b_hÖhe%-17
  119.   y2|=y|+b_hÖhe%-5
  120.   BOX x1%,y1|,x2%,y2|
  121.   TEXT mitte&-(LEN(text$)*8/2),y2|-3,text$
  122.   '
  123.   spy|=syo&+23
  124.   spx&=(sxl&-12)+(SUCC(wert&-min&)/(SUCC(max&-min&)/200))
  125.   SPRITE #2,spx&,spy|
  126.   '
  127.   REPEAT
  128.     WHILE MOUSEX>sxl&-20 AND MOUSEX<sxr&+20 AND MOUSEY>syo& AND MOUSEY<syu& AND MOUSEK=1
  129.       IF MOUSEX>sxl& AND MOUSEX<sxr&
  130.         spx&=MOUSEX-18
  131.         IF spx&<sxl&-11
  132.           spx&=sxl&-11
  133.         ELSE IF spx&>sxr&-30
  134.           spx&=sxr&-30
  135.         ENDIF
  136.         wert&=min&+SUCC(max&-min&)/200*(spx&-sxl&+11)
  137.       ELSE IF MOUSEX>sxr& AND MOUSEX<sxr&+20 AND wert&<max&
  138.         PAUSE 3
  139.         INC wert&
  140.         spx&=(sxl&-12)+(SUCC(wert&-min&)/(SUCC(max&-min&)/200))
  141.       ELSE IF MOUSEX>sxl&-20 AND MOUSEX<sxl& AND wert&>min&
  142.         PAUSE 3
  143.         DEC wert&
  144.         spx&=(sxl&-12)+(SUCC(wert&-min&)/(SUCC(max&-min&)/200))
  145.       ENDIF
  146.       IF LEN(STR$(wert&))*8<>tl|
  147.         COLOR 0
  148.         PBOX mitte&-24,y|+g_y|+28,mitte&+24,y|+g_y|+38
  149.         COLOR 1
  150.       ENDIF
  151.       tl|=LEN(STR$(wert&))*8
  152.       TEXT mitte&-tl|/2,ty|,wert&
  153.       SPRITE #2,spx&,spy|
  154.       '
  155.       DPOKE &HDFF0A6+kanal|*&H10,wert&  ! Muss hier stehen, kontinuierliche Veraenderung
  156.       '
  157.     WEND
  158.     @mausselect
  159.   UNTIL MOUSEX>x1% AND MOUSEX<x2% AND MOUSEY>y1| AND MOUSEY<y2| AND MOUSEK=1
  160.   SPRITE #2
  161. RETURN
  162. > PROCEDURE kanalwahl_Ändern
  163.   selx&=MOUSEX
  164.   sely&=MOUSEY
  165.   IF selx&>250 AND selx&<405 AND sely&>33 AND sely&<44 AND MOUSEK=1
  166.     SELECT selx&
  167.     CASE 250 TO 270
  168.       kanal|=0
  169.       wert&=wert&(0)           !Alten Wert fortsetzen
  170.       @schiebe_regler(180,90,"Frequenz-Einstellung",0,0,0,1000,wert&)
  171.       wert&(0)=wert&           !Neuen Wert retten
  172.     CASE 295 TO 315
  173.       kanal|=1
  174.       wert&=wert&(1)
  175.       @schiebe_regler(180,90,"Frequenz-Einstellung",0,0,0,1000,wert&)
  176.       wert&(1)=wert&
  177.     CASE 340 TO 360
  178.       kanal|=2
  179.       wert&=wert&(2)
  180.       @schiebe_regler(180,90,"Frequenz-Einstellung",0,0,0,1000,wert&)
  181.       wert&(2)=wert&
  182.     CASE 385 TO 405
  183.       kanal|=3
  184.       wert&=wert&(3)
  185.       @schiebe_regler(180,90,"Frequenz-Einstellung",0,0,0,1000,wert&)
  186.       wert&(3)=wert&
  187.     ENDSELECT
  188.   ENDIF
  189. RETURN
  190. > PROCEDURE mausselect
  191.   PAUSE 2               ! Warte auf Benutzer
  192.   selx&=MOUSEX
  193.   sely&=MOUSEY
  194.   IF selx&>250 AND selx&<405 AND sely&>64 AND sely&<74 AND MOUSEK=1
  195.     SELECT selx&
  196.     CASE 250 TO 270
  197.       kan|=0
  198.       zeiger|=BCHG(zeiger|,0)
  199.       IF BTST(zeiger|,0)
  200.         TEXT 246,85,"AN "
  201.         DPOKE &HDFF096,&H8201
  202.       ELSE IF BTST(zeiger|,0)=FALSE!
  203.         TEXT 246,85,"AUS"
  204.         DPOKE &HDFF096,1
  205.       ENDIF
  206.     CASE 295 TO 315
  207.       kan|=1
  208.       zeiger|=BCHG(zeiger|,1)
  209.       IF BTST(zeiger|,1)
  210.         TEXT 246+46*kan|,85,"AN "
  211.         DPOKE &HDFF096,&H8202
  212.       ELSE IF BTST(zeiger|,1)=FALSE!
  213.         TEXT 246+46*kan|,85,"AUS"
  214.         DPOKE &HDFF096,2
  215.       ENDIF
  216.     CASE 340 TO 360
  217.       kan|=2
  218.       zeiger|=BCHG(zeiger|,2)
  219.       IF BTST(zeiger|,2)
  220.         TEXT 246+46*kan|,85,"AN "
  221.         DPOKE &HDFF096,&H8204
  222.       ELSE IF BTST(zeiger|,2)=FALSE!
  223.         TEXT 246+46*kan|,85,"AUS"
  224.         DPOKE &HDFF096,4
  225.       ENDIF
  226.     CASE 385 TO 405
  227.       kan|=3
  228.       zeiger|=BCHG(zeiger|,3)
  229.       IF BTST(zeiger|,3)
  230.         TEXT 246+46*kan|,85,"AN "
  231.         DPOKE &HDFF096,&H8208
  232.       ELSE IF BTST(zeiger|,3)=FALSE!
  233.         TEXT 246+46*kan|,85,"AUS"
  234.         DPOKE &HDFF096,8
  235.       ENDIF
  236.     ENDSELECT
  237.   ENDIF
  238. RETURN
  239. > PROCEDURE kanalbox
  240.   COLOR 1
  241.   FOR i|=0 TO 3
  242.     BOX 250+45*i|,64,270+45*i|,74
  243.     BOX 240+46*i|,77,280+46*i|,87
  244.     TEXT 256+45*i|,72,i|+1
  245.     TEXT 246+46*i|,85,"AUS"
  246.   NEXT i|
  247.   BOX 237,62,420,89
  248.   TEXT 274,60,"Kanal Schalter"
  249.   FOR i|=0 TO 3
  250.     BOX 250+45*i|,33,270+45*i|,44
  251.     TEXT 256+45*i|,42,i|+1
  252.   NEXT i|
  253.   BOX 247,32,408,46
  254.   TEXT 274,30,"Kanal auswahl"
  255. RETURN
  256.